//
//  CZComposeViewController.swift
//  Weibo30
//
//  Created by apple on 16/8/16.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

//  发微博控制器
class CZComposeViewController: UIViewController {

    //  MARK:   - 懒加载控件
    //  右边按钮
    private lazy var rightButton: UIButton  = {
        let button = UIButton()
        //  添加点击事件
        button.addTarget(self, action: "sendAction", forControlEvents: .TouchUpInside)
        button.setTitle("发送", forState: .Normal)
        button.titleLabel?.font = UIFont.systemFontOfSize(15)
        //  设置不同状态的文字颜色
        button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        button.setTitleColor(UIColor.grayColor(), forState: .Disabled)
        
        //  设置不头痛状态的背景图片
        button.setBackgroundImage(UIImage(named: "common_button_orange"), forState: .Normal)
        button.setBackgroundImage(UIImage(named: "common_button_orange_highlighted"), forState: .Highlighted)
        button.setBackgroundImage(UIImage(named: "common_button_white_disable"), forState: .Disabled)
        //  设置大小
        button.size = CGSize(width: 45, height: 30)
        //  不管用, 这个按钮被UIBarButtonItem管理者
//        button.enabled = false
        
//        button.userInteractionEnabled = false
        return button
    
    }()
    
    //  标题视图
    private lazy var titleView: UILabel = {
        let label = UILabel(fontSize: 17, textColor: UIColor.darkGrayColor())
        
        if let name = CZUserAccountViewModel.sharedUserAccount.userAccount?.name {
            let result = "发微博\n\(name)"
            //  获取名称的range
            let range = (result as NSString).rangeOfString(name)
            
            
            let attribuedStr = NSMutableAttributedString(string: result)
            //  添加富文本属性
            attribuedStr.addAttributes([NSForegroundColorAttributeName: UIColor.lightGrayColor(), NSFontAttributeName: UIFont.systemFontOfSize(14)], range: range)
            
            label.attributedText = attribuedStr
        } else {
            label.text = "发微博"
        }
        
        
        //  多行显示
        label.numberOfLines = 0
        label.textAlignment = .Center
        label.sizeToFit()
        return label
    }()
    
    
    //  发微博视图
    private lazy var textView: CZComposeTextView = {
        let view = CZComposeTextView()
        //  设置代理
        view.delegate = self
        view.placeHolder = "请输入微博内容~"
        view.font = UIFont.systemFontOfSize(14)
        //  垂直方向开启拖动
        view.alwaysBounceVertical = true
        //  扩展 不想要纠错工具条的显示
        view.autocorrectionType = .No
        return view
    }()
    
    //  toolbar
    private lazy var toolBar: CZComposeToolBar = {
        let composeToolbar = CZComposeToolBar(frame: CGRectZero)
//        composeToolbar.backgroundColor = UIColor.redColor()
        return composeToolbar
    }()
    
    //  配图
    private lazy var pictureView: CZComposePictureView = {
        let picView = CZComposePictureView()
        picView.backgroundColor = self.textView.backgroundColor
        return picView
    }()
    
    //  表情键盘
    private lazy var emoticonKeyBoard: CZEmoticonKeyBoard = {
        
        let emoticonKeyBoard = CZEmoticonKeyBoard()
        //  指定表情键盘大小
        emoticonKeyBoard.size = CGSize(width: self.textView.width, height: 216)
        return emoticonKeyBoard
        
    }()
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    
    }
    //  添加控件设置约束
    private func setupUI() {

        view.backgroundColor = UIColor.whiteColor()
        //  监听键盘改变的通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardFrameChange:", name: UIKeyboardWillChangeFrameNotification, object: nil)
        
        //  监听点击表情按钮的通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didSelectedEmoticon:", name: DidSelectedEmoticonNotification, object: nil)
        
        //  监听点击删除表情按钮的通知
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didSelecteDeleteEmoticon", name: DidSelectedDeleteEmoticonNotification, object: nil)
        
        setupNavUI()
        
        //  添加控件
        view.addSubview(textView)
        textView.addSubview(pictureView)
        view.addSubview(toolBar)
        textView.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(view)
            make.leading.equalTo(view)
            make.trailing.equalTo(view)
            make.bottom.equalTo(toolBar.snp_top)
        }
        
        pictureView.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(textView).offset(100)
            make.centerX.equalTo(textView)
            make.width.equalTo(textView.snp_width).offset(-10)
            make.height.equalTo(textView.snp_width).offset(-10)
        }
        
        toolBar.snp_makeConstraints { (make) -> Void in
            make.bottom.equalTo(view)
            make.leading.equalTo(view)
            make.trailing.equalTo(view)
            make.height.equalTo(35)
        }
        //  分析处理有循环引用 使用 [weak self]
        toolBar.didSelecteToolBarButtonClosure = { [weak self] (type: CZComposeToolBarButtonType) in
        
            //  根据点击按钮的枚举值进行判断
            switch type {
            
            case .Picture:
                print("图片")
                self?.didSelectedPicture()
            case .Mention:
                print("@")
            case .Trend:
                print("#")
            case .Emoticon:
                print("表情")
                self?.didSelecedEmoticon()
            case .Add:
                print("加号")
            }
            
            
        
        }
        
        //  设置配图点击加号的闭包
        pictureView.didSeletedAddImageViewClosure = { [weak self] in
            self?.didSelectedPicture()
        }
        
        
    }
    
    //  设置导航栏视图
    private func setupNavUI() {
    
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "取消", target: self, action: "cancelAction")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightButton)
        //  设置右边的按钮不可用
        navigationItem.rightBarButtonItem?.enabled = false
        
        //  设置导航栏的自定义titleView
        navigationItem.titleView = titleView
        
    }
    
    //  MARK:   - 监听点击删除表情按钮的通知方法
    @objc private func didSelecteDeleteEmoticon() {
        //  删除textview内容
        textView.deleteBackward()
    
    }
    
    
    //  MARK:   - 监听点击表情按钮的通知方法
    @objc private func didSelectedEmoticon(noti: NSNotification) {
        
        //  获取表情模型
        let emoticon = noti.object as! CZEmoticon
        
        //  插入表情富文本
        textView.insertEmoticon(emoticon)
        
        
        
//        //  通过不同的表情类型设置不同表情内容
//        if emoticon.type == "0" {
//            //  图片
////            textView.insertText(emoticon.chs!)
//            
//            //  记录上一次的富文本
//            let originalAttributeStr = NSMutableAttributedString(attributedString: textView.attributedText)
//            
//            //   1. 通过图片名创建一个UIImage对象
//            let image = UIImage(named: emoticon.path!)
//            //   2. 通过UIImage对象创建一个文本附件(NSTextAttachment)
//            let attachment = NSTextAttachment()
//           
//            //  获取文字的行高
//            let fontHeight = textView.font!.lineHeight
//             //  设置图片大小和位置, 设置bounds会影响子控件的布局
//            attachment.bounds = CGRect(x: 0, y: -4, width: fontHeight, height: fontHeight)
//            //  设置图片
//            attachment.image = image
//            //   3. 通过文本附件创建富文本(NSAttributedString)
//            let attributedStr = NSAttributedString(attachment: attachment)
//            
//            //  追加富文本
////            originalAttributeStr.appendAttributedString(attributedStr)
//            
//            //  获取选中的富文本的范围
//            var range = textView.selectedRange
//            //  设置选中范围的富文本
//            originalAttributeStr.replaceCharactersInRange(range, withAttributedString: attributedStr)
//            
//            
//            //   设置富文本字体的大小
//            originalAttributeStr.addAttribute(NSFontAttributeName, value: textView.font!, range: NSMakeRange(0, originalAttributeStr.length))
//            
//            //   4. 设置富文本
//            textView.attributedText = originalAttributeStr
//            
//            //  添加一个表情富文本让其光标位置+1, 让选中范围设置为0
//            range.location += 1; range.length = 0
//            
//            //  设置选中范围
//            textView.selectedRange = range
//            
//            
//            
//            
//        } else {
//            //  emoji
//            textView.insertText((emoticon.code! as NSString).emoji())
//        }
        
        
        
        
    }
    
    //  MARK:   - 监听键盘改变的通知方法
    @objc private func keyboardFrameChange(noti: NSNotification) {
    
        //  获取键盘的frame
        let keyBoardFrame = (noti.userInfo!["UIKeyboardFrameEndUserInfoKey"] as! NSValue).CGRectValue()
        //  获取动画时长
        let duration = (noti.userInfo!["UIKeyboardAnimationDurationUserInfoKey"] as! NSNumber).doubleValue
        
        
        //  更新约束
        toolBar.snp_updateConstraints { (make) -> Void in
            make.bottom.equalTo(view).offset(keyBoardFrame.origin.y - self.view.height)
        }
        //  更新约束动画
        UIView.animateWithDuration(duration) { () -> Void in
            self.view.layoutIfNeeded()
        }
        
        
        
    }
    
    
    //  MARK:   - 点击事件
    @objc private func cancelAction() {
        
        //  取消第一响应者
        self.view.endEditing(true)
        
        dismissViewControllerAnimated(true, completion: nil)
        
        
    }
    
    @objc private func sendAction() {
        
        
        
        //  代码已经抽取到CZComposeTextView+Extension分类中
//        //  通过遍历富文本获取字符串基本信息
//        //  info 富文本的信息
//        //  range 富文本的范围
//        //  是否停止 stop -> stop.memory = true
//        var result = ""
//        textView.attributedText.enumerateAttributesInRange(NSMakeRange(0, textView.attributedText.length), options: []) { (info, range, stop) -> Void in
////            print(info)
////            print(range)
//            if let attachment = info["NSAttachment"] as? CZTextAttachment {
//                //  表示图片富文本
//                let emoticon = attachment.emoticon!
//               
//                //  获取表情描述
//                result += emoticon.chs!
//               
//                
//            } else {
//                //  文本富文本
//                //  获取文本富文本的字符串, 通过指定的范围获取富文本然后再获取富文本对应的字符串
//                result += self.textView.attributedText.attributedSubstringFromRange(range).string
//            }
//        
//        
//        }
//        print(result)
        
        
        
        
        //  判断是否有没有图片,有图片调用上传图片的微博接口
        if pictureView.images.count > 0 {
            upload()
            
        } else {
            
            update()

        }
        
        
    }
    
    
    //  发送文字微博内容
    private func update() {
        //  没有图片执行的发送文字微博接口
        //  获取微博内容
        let status = textView.emoticonText //textView.text!
        //  获取accesstoken
        let accessToken = CZUserAccountViewModel.sharedUserAccount.accessToken!
        //  请求发送微博文字接口
        SVProgressHUD.show()
        CZNetworkTools.sharedTools.update(accessToken, status: status) { (response, error) -> () in
            if error != nil {
                SVProgressHUD.showErrorWithStatus("网络异常发送失败")
                print(error)
                return
            }
            SVProgressHUD.showSuccessWithStatus("发送成功")
        }
    
    }
    
    
    //  发送带图片的微博内容
    private func upload() {
        //  获取微博内容
        let status = textView.emoticonText //textView.text!
        //  获取accesstoken
        let accessToken = CZUserAccountViewModel.sharedUserAccount.accessToken!
        //  获取图片
        let image = pictureView.images.first!
        
        SVProgressHUD.show()
        CZNetworkTools.sharedTools.upload(accessToken, status: status, image: image, callBack: { (response, error) -> () in
            if error != nil {
                SVProgressHUD.showErrorWithStatus("网络异常, 发送失败")
                print(error)
                return
            }
            
            SVProgressHUD.showSuccessWithStatus("发送成功")
            
        })
    
    }
    
    
    
    

}


//  MARK:   点击toolbar按钮处理逻辑
extension CZComposeViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    //  处理点击表情按钮逻辑
    func didSelecedEmoticon() {
        
        if textView.inputView == nil {
            //  设置自定义表情键盘
            textView.inputView = emoticonKeyBoard
            toolBar.switchEmotionIcon(true)
        } else {
            //  设置为系统键盘
            textView.inputView = nil
            toolBar.switchEmotionIcon(false)
        }
        
        //  设置其为第一响应者
        textView.becomeFirstResponder()
        //  重写刷新inputview
        textView.reloadInputViews()
        
    
    }
    
    
    //  处理点击图片逻辑
    func didSelectedPicture() {
        let picCtr = UIImagePickerController()
        picCtr.delegate = self
        
        if UIImagePickerController.isSourceTypeAvailable(.Camera) {
            //  设置来源类型
            picCtr.sourceType = .Camera
        
        } else {
            //  设置图库
            picCtr.sourceType = .PhotoLibrary
        }
        
        //  判断前置摄像头是否可用
        if UIImagePickerController.isCameraDeviceAvailable(.Front) {
        
            print("前置摄像头可用")
        } else if UIImagePickerController.isCameraDeviceAvailable(.Rear) {
            print("后者摄像头可用")
        } else {
            print("没有摄像头")
        }
        
        //  是否允许编辑
        //picCtr.allowsEditing = true
        
        presentViewController(picCtr, animated: true, completion: nil)
        
        
    
    }
    
    //  MARK:   -UIImagePickerControllerDelegate 实现代理方法, 如果实现了代理方法直接调用dismis操作
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
        
        let scaleImage = image.scaleImageWithScaleWidth(200)
//        let data1 = UIImagePNGRepresentation(scaleImage)
//        let data2 = UIImageJPEGRepresentation(scaleImage, 0.5)
//        data1?.writeToFile("/Users/apple/Desktop/1.png", atomically: true)
//        data2?.writeToFile("/Users/apple/Desktop/2.png", atomically: true)
        
        
        //  添加配图信息
        pictureView.addImage(scaleImage)
        
        
        //
        picker.dismissViewControllerAnimated(true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        picker.dismissViewControllerAnimated(true, completion: nil)
    }
    
    
//    //  等比压缩图片
//    func scaleImageWithScaleWidth(scaleWidth: CGFloat, image: UIImage) -> UIImage {
//            //  原始的宽度 100 , 高亮 200 , 压缩后的宽度50 高度 100
//        //  计算等比压缩后的高度
//        let scaleHeight = scaleWidth / image.size.width * image.size.height
//    
//        let size = CGSize(width: scaleWidth, height: scaleHeight)
//        //  开启图片上下文
//        UIGraphicsBeginImageContext(size)
//        
//        //  图片绘制到指定区域内
//        image.drawInRect(CGRect(origin: CGPointZero, size: size))
//        //  通过上下文获取压缩后的图片
//        let scaleImage = UIGraphicsGetImageFromCurrentImageContext()
//        
//        //  关闭图片上下文
//        UIGraphicsEndImageContext()
//        
//        return scaleImage
//        
//    }
    
    
    
    
    
    

}




//  MARK:   -实现UITextViewDelegate代理方法
extension CZComposeViewController: UITextViewDelegate {

    //  内容改变
    func textViewDidChange(textView: UITextView) {
        //  如果有内容则右侧按钮可用,否则不可用
        navigationItem.rightBarButtonItem?.enabled = textView.hasText()
    }
    
    //  将要拖动的时候让其失去第一响应者
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        //  失去第一响应者
        self.view.endEditing(true)
    }
}











